<?php
declare (strict_types = 1);

namespace app\controller\api;

use app\BaseController;
use app\model\Admin as AdminModel;
use think\facade\Session;
use app\service\AuthService;
use app\service\LogService;

class Admin extends BaseController
{
    protected $logService;
    protected $authService;

    protected function initialize()
    {
        parent::initialize();
        $this->logService = new LogService();
        $this->authService = new AuthService();
        
        // 检查管理员登录状态
        if (!Session::has('admin_id')) {
            $this->error('请先登录', null, 401);
        }
        
        // 检查权限
        $this->checkAuth();
    }
    
    /**
     * 获取管理员列表
     */
    public function index()
    {
        $page = input('page/d', 1);
        $limit = input('limit/d', 10);
        $status = input('status/d', -1);
        
        $where = [];
        if ($status >= 0) {
            $where['status'] = $status;
        }
        
        $list = AdminModel::getPageList($where, $page, $limit);
        $this->success('获取成功', $list);
    }
    
    /**
     * 添加管理员
     */
    public function add()
    {
        $data = input('post.');
        
        // 验证用户名是否存在
        if (AdminModel::where('username', $data['username'])->find()) {
            $this->error('用户名已存在');
        }
        
        // 密码加密
        $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        
        $admin = new AdminModel;
        $admin->save($data);
        
        // 记录操作日志
        $this->logService->addLog(session('admin_id'), 'add_admin', '添加管理员：' . $data['username']);
        
        $this->success('添加成功');
    }
    
    /**
     * 编辑管理员
     */
    public function edit()
    {
        $data = input('post.');
        
        // 验证用户名是否存在
        $admin = AdminModel::where('username', $data['username'])
            ->where('id', '<>', $data['id'])
            ->find();
        if ($admin) {
            $this->error('用户名已存在');
        }
        
        // 如果修改密码，则加密
        if (!empty($data['password'])) {
            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        } else {
            unset($data['password']);
        }
        
        AdminModel::update($data);
        
        // 记录操作日志
        $this->logService->addLog(session('admin_id'), 'edit_admin', '编辑管理员：' . $data['username']);
        
        $this->success('编辑成功');
    }
    
    /**
     * 删除管理员
     */
    public function delete()
    {
        $id = input('id/d');
        if (!$id) {
            $this->error('参数错误');
        }
        
        $admin = AdminModel::find($id);
        if (!$admin) {
            $this->error('管理员不存在');
        }
        
        // 不能删除超级管理员
        if ($id == 1) {
            $this->error('不能删除超级管理员');
        }
        
        AdminModel::destroy($id);
        
        // 记录操作日志
        $this->logService->addLog(session('admin_id'), 'delete_admin', '删除管理员：' . $admin['username']);
        
        $this->success('删除成功');
    }

    /**
     * 检查权限
     */
    protected function checkAuth()
    {
        $adminId = session('admin_id');
        if (!$adminId) {
            $this->error('请先登录', null, 401);
        }

        // 超级管理员不检查权限
        if ($adminId === 1) {
            return true;
        }

        // 获取当前请求的控制器和方法
        $controller = strtolower(request()->controller());
        $action = strtolower(request()->action());

        // 检查权限
        if (!$this->authService->checkAuth($adminId, $controller, $action)) {
            $this->error('没有操作权限');
        }

        return true;
    }
} 